package com.jichangxiu.system.service.impl;

import cn.hutool.core.util.ObjectUtil;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.jichangxiu.system.entity.dto.SysUserPostDto;
import com.jichangxiu.system.entity.dto.edit.EditSysUser;
import com.jichangxiu.system.entity.po.SysUserPost;
import com.jichangxiu.system.mapper.SysUserPostMapper;
import com.jichangxiu.system.service.SysUserPostService;
import com.jichangxiu.framework.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;

/**
 * SysUserPostServiceImpl:
 *
 * @author JiChangXiu
 * @create 2024-06-28 13:44:59
 */
@Slf4j
@Service
public class SysUserPostServiceImpl extends MPJBaseServiceImpl<SysUserPostMapper, SysUserPost> implements SysUserPostService {

    /**
     * 增加 / 修改 / 删除 用户岗位关联列表
     *
     * @param editSysUser        系统用户
     * @param sysUserPostDtoList 用户岗位关联对象列表
     * @return 是否成功
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Boolean addOrDelOrEdit(EditSysUser editSysUser, List<SysUserPostDto> sysUserPostDtoList) {
        // 用户和岗位的关联关系
        boolean b1 = true;
        boolean b2 = true;
        // 页面传来的
        List<String> postIdList = editSysUser.getPostIdList();
        // 最终会向数据库中添加的
        List<SysUserPost> addSysUserPostList = new ArrayList<>();
        // 会从数据库中删除的
        List<String> deleteSysUserPostIdList = new ArrayList<>();
        // 如果两个对象都是空的
        if (ObjectUtil.isEmpty(postIdList) && ObjectUtil.isEmpty(sysUserPostDtoList)) {
            // 这种情况啥也不做
            log.info("本次无需操作");
        }
        // 如果两个对象都不是空的
        else if (ObjectUtil.isNotEmpty(postIdList) && ObjectUtil.isNotEmpty(sysUserPostDtoList)) {
            // 这种情况最为复杂
            // 先处理向数据库中添加的
            for (String postId : postIdList) {
                // 默认在数据库中不存在
                boolean flag = false;
                for (SysUserPostDto sysUserPostDto : sysUserPostDtoList) {
                    // 如果相等说明在数据库中存在
                    if (postId.equals(sysUserPostDto.getPostId())) {
                        flag = true;
                        break;
                    }
                }
                // 不存在的话就新增
                if (!flag)
                    addSysUserPostList.add(SysUserPost.builder().userId(editSysUser.getId()).postId(postId).tenantId(SecurityUtils.getTenantId()).build());
            }
            // 在处理从数据库中删除的
            for (SysUserPostDto sysUserPostDto : sysUserPostDtoList) {
                // 默认此条数据库记录不在本次页面对象中
                boolean flag = false;
                for (String postId : postIdList) {
                    // 如果相等说明数据库记录在本次页面对象中
                    if (sysUserPostDto.getPostId().equals(postId)) {
                        flag = true;
                        break;
                    }
                }
                // 如果全部循环完成后发现数据库记录没有出现在本次页面提交的数据中，那么说明它已被用户删除
                if (!flag)
                    deleteSysUserPostIdList.add(sysUserPostDto.getId());
            }
        }
        // 如果一个对象空的，另一个不是空的
        else if (ObjectUtil.isEmpty(postIdList) && ObjectUtil.isNotEmpty(sysUserPostDtoList)) {
            // 数据库中的数据全部删除
            sysUserPostDtoList.forEach(platformUserPost -> deleteSysUserPostIdList.add(platformUserPost.getId()));
        }
        // 如果一个对象空的，另一个不是空的
        else if (ObjectUtil.isNotEmpty(postIdList) && ObjectUtil.isEmpty(sysUserPostDtoList)) {
            // 页面传来的需要全部在数据库创建
            postIdList.forEach(postId -> addSysUserPostList.add(SysUserPost.builder().userId(editSysUser.getId()).postId(postId).tenantId(SecurityUtils.getTenantId()).build()));
        }
        // addSysUserPostList
        if (ObjectUtil.isNotEmpty(addSysUserPostList))
            b1 = saveBatch(addSysUserPostList);
        // deleteSysUserPostIdList
        if (ObjectUtil.isNotEmpty(deleteSysUserPostIdList))
            b2 = removeBatchByIds(deleteSysUserPostIdList);
        return b1 && b2;
    }

}